package com.rybbaby.tss.platform.sysConfig.controller;

import com.rybbaby.tss.core.annotation.RequestLog;
import com.rybbaby.tss.core.annotation.Token;
import com.rybbaby.tss.core.annotation.validator.RegexpValidator;
import com.rybbaby.tss.core.annotation.validator.StringValidator;
import com.rybbaby.tss.core.bean.PageBean;
import com.rybbaby.tss.core.hqlsearch.HqlGenerateUtil;
import com.rybbaby.tss.core.utils.AjaxJsonResponse;
import com.rybbaby.tss.core.utils.PropertiesReadUtil;
import com.rybbaby.tss.core.utils.SequenceUtil;
import com.rybbaby.tss.core.utils.StringUtils;
import com.rybbaby.tss.core.web.controller.BaseController;
import com.rybbaby.tss.platform.initializer.SysConfigInitializer;
import com.rybbaby.tss.platform.sysConfig.entity.SysConfig;
import com.rybbaby.tss.platform.sysConfig.service.ISysConfigService;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @description 系统参数管理
 * 
 * @author 谢进伟
 * 
 * @createDate 2016-11-26 上午10:12:57
 */
@Controller
@RequestMapping(value = "sysConfigController")
public class SysConfigController extends BaseController {
	
	@Autowired
	private ISysConfigService sysConfigService;
	
	/**
	 * 获取系统参数列表
	 * 
	 * @return
	 * @throws IOException
	 */
	@RequestLog(content = "获取系统参数列表" , save = true)
	@RequestMapping(value = "sysConfigList" , method = RequestMethod.POST)
	public ModelAndView sysConfigList(SysConfig entity , PageBean paramPageBean) {
		ModelAndView mav = new ModelAndView(PropertiesReadUtil.getStringProperty("sysConfigListView"));
		try {
			Map<String , String []> unLockMap = getParameterMap(request);
			DetachedCriteria dc = DetachedCriteria.forClass(SysConfig.class);
			HqlGenerateUtil.fillDetachedCriteria(dc , entity , unLockMap);
			PageBean pageBean = sysConfigService.pageList(dc , paramPageBean.getPageNo() , paramPageBean.getPageSize());
			mav.addObject(super.SEARCH_MAP , unLockMap);
			mav.addObject(super.PAGE_BEAN , pageBean);
			mav.addObject("searchFormId" , SEARCH_FORM);
			mav.addObject("actionUrl" , request.getRequestURI());
			mav.addObject("pagingBar" , pageBean.getPagingBar(SEARCH_FORM));
			mav.addObject("serializeNum" , SequenceUtil.getUpperCaseUUID());
			String requestURI = StringUtils.substringBeforeLast(request.getRequestURI() , "/");
			mav.addObject("editUrl" , requestURI + "/toEditView.do");
			mav.addObject("deleteUrl" , requestURI + "/delete.do");
			mav.addObject("batchDeleteUrl" , requestURI + "/batchDelete.do");
		} catch (Exception e) {
			throw e;
		}
		return mav;
	}
	
	/**
	 * 转到编辑视图
	 * 
	 * @param entity
	 *            接收编辑参数的临时对象
	 * @param serializeNum
	 *            请求标识
	 * @return
	 */
	@RequestLog(content = "转到系统参数视图" , save = true)
	@RequestMapping(value = "toEditView" , method = RequestMethod.GET)
	public ModelAndView toEditView(SysConfig entity , @RequestParam(required = true) String serializeNum) {
		ModelAndView mav = new ModelAndView(PropertiesReadUtil.getStringProperty("sysConfigEditView"));
		if(entity != null && entity.getId() != null) {
			SysConfig editEntity = this.sysConfigService.get(entity.getId());
			mav.addObject("editEntity" , editEntity);
			mav.addObject("editModel" , "edit");
		} else {
			mav.addObject("editModel" , "add");
		}
		// 组名数据源
		List<Map<String , Object>> groupId_datasources = this.sysConfigService.groupIdDatasource();
		mav.addObject("groupId_datasources" , groupId_datasources);
		mav.addObject("serializeNum" , serializeNum);
		mav.addObject("saveUrl" , StringUtils.substringBeforeLast(request.getRequestURI() , "/") + "/saveOrUpdate.do");
		return mav;
	}
	
	/**
	 * 保存编辑的对象
	 * 
	 * @param entity
	 *            被编辑对象
	 * @return
	 */
	@ResponseBody
	@RequestLog(content = "保存系统参数对象" , save = true)
	@Token(validateToken = false)
	@RequestMapping(value = "saveOrUpdate" , method = RequestMethod.POST)
	public String saveOrUpdate(SysConfig entity) {
		AjaxJsonResponse ajr = new AjaxJsonResponse();
		try {
			String id = entity.getId();
			ajr.setResMsg("保存成功!");
			Object loginUserId_obj = getLoginUserId();
			if(StringUtils.isNotBlank(id)) {
				SysConfig destEntity = this.sysConfigService.get(id);
				BeanUtils.copyProperties(entity , destEntity , "createTime");
				destEntity.setCreateUserId(loginUserId_obj == null ? null : loginUserId_obj.toString());
				this.sysConfigService.updateEntitiy(destEntity);
				SysConfigInitializer.load();
			} else {
				entity.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
				entity.setCreateUserId(loginUserId_obj == null ? null : loginUserId_obj.toString());
				Serializable newId = this.sysConfigService.save(entity);
				if(newId == null) {
					ajr.setResCode(301);
					ajr.setResMsg("保存失败!");
				} else {
					SysConfigInitializer.load();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			ajr.setResCode(500);
			ajr.setResMsg("保存失败(" + e.getMessage() + ")!");
		}
		return ajr.jsonResponse(false);
	}
	
	/**
	 * 删除指定id的对象
	 * 
	 * @param id
	 *            需要被删除的对象id
	 * @return
	 */
	@ResponseBody
	@RequestLog(content = "删除属性" , save = true)
	@RequestMapping(value = "delete" , method = RequestMethod.GET)
	public String delete(@StringValidator(nullable = false) String id) {
		AjaxJsonResponse ajr = new AjaxJsonResponse();
		try {
			ajr.setResMsg("删除成功!");
			if(StringUtils.isNotBlank(id)) {
				this.sysConfigService.deleteEntityById(id);
				SysConfigInitializer.load();
			} else {
				ajr.setResMsg("删除失败!");
				ajr.setResCode(302);
			}
		} catch (Exception e) {
			e.printStackTrace();
			ajr.setResCode(500);
			ajr.setResMsg("删除失败(" + e.getMessage() + ")!");
		}
		return ajr.jsonResponse(false);
	}
	
	/**
	 * 批量删除指定id的对象
	 * 
	 * @param ids
	 *            需要被删除的对象id组成的字符串
	 * @return
	 */
	@ResponseBody
	@RequestLog(content = "删除属性" , save = true)
	@RequestMapping(value = "batchDelete" , method = RequestMethod.GET)
	public String batchDelete(@RegexpValidator(nullable = false , regexp = "^(\\w+,?)+\\w+$") String ids) {
		AjaxJsonResponse ajr = new AjaxJsonResponse();
		try {
			ajr.setResMsg("删除成功!");
			if(StringUtils.isNotBlank(ids)) {
				boolean batchDelete = this.sysConfigService.batchDelete(ids.split(","));
				if(!batchDelete) {
					ajr.setResMsg("删除失败!");
					ajr.setResCode(302);
				} else {
					SysConfigInitializer.load();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			ajr.setResCode(500);
			ajr.setResMsg("删除失败(" + e.getMessage() + ")!");
		}
		return ajr.jsonResponse(false);
	}
}
